#!/usr/bin/python
# coding=utf-8

# Tradutor de titulos e sinopses
# Fabio Longarai Silva <fabio@longarai.com>
# 18/02/2010
# Use por sua conta e risco, faca sempre backups dos arquivos "nfo" antes :)

# Modificado por gfjardim <gfjardim@gmail.com> e eseffair <eseffair@gmail.com>
# Interface grafica por eseffair <eseffair@gmail.com>

APPVER = "r19"
HelpURL = "http://www.htforum.com/vb/showthread.php/133437-Tradutor-Ember-XBMC"

# Libs
import urllib, re, sys, codecs, htmlentitydefs, os, shutil, ConfigParser, webbrowser, thread
from xml.dom.minidom import parse, parseString
from datetime import datetime
from sys import exit
from Tkinter import *
import tkFileDialog, tkMessageBox

## Variáveis do sistema e diretórios
if sys.platform == 'win32':
	appdata = os.path.join(os.environ['APPDATA'], "tradutor-ember")
	sysencode = "cp850"
else:
	sysencode = sys.getfilesystemencoding()
	appdata = os.path.normpath(os.path.expanduser("~./tradutor-ember"))

if not os.path.isdir(appdata):
	os.mkdir(appdata)
inifile = os.path.join(appdata,"config.ini")
if not os.path.isfile(inifile):
	f = open(inifile,"w")
	f.write(" ")
	f.close()

# Logs
log_ignorados = []
log_traduzidos = []
log_faltantes = []

# Alguns sites brasileiros possuem pequenas inconsistencias com a informacao do imdb
# A mais comun e haver diferenca de ano, nao sei se eles colocam o ano de lancamento
# no brasil ou algo assim, mas ja vi filmes de 2006 listados como 2007 em alguns sites.
#
# Para contornar isso, inseri um fator de tolerancia na variavel YEAR_MAX_ERROR
#
# Se colocarmos em 0 ele considera as comparacoes de ano exatas, conforme se aumenta
# o valor ele aumenta a tolerancia.
# Recomendado: 1
YEAR_MAX_ERROR = 1

# OBSOLETO #
# Nao sao mais feitas comparacoes de diretores pois alguns sites nao possuem
# padrao no formato dos dados e isso inviabiliza a extracao
LAZY_DIRECTOR_COMPARISION = 1

#### Funcoes basicas ####
# Limpa strings e racionaliza espacos
def chomp(s):
	s = s.strip("\t\r\n")
	s = re.sub('\t', ' ', s)	
	s = re.sub('\s', ' ', s)
	s = re.sub('^ ', '', s)
	s = re.sub(' $', '', s)
	return s

	
# Transpoem artigos iniciais de frases.
# "O Homem Mau" se transforma em "Homem Mau, O"
# Idiomas suportados: ingles, portugues e espanhol.
def shiftarticle(s):
	for art in [ 'The', 'O', 'A', 'Os', 'As', 'El', 'La', 'Los', 'Las', 'Les', 'Le' ]:
		x = '^' + art + ' '
		y = ', ' + art
		if re.search(x, s):
			return re.sub(x, '', s) + y
	return s

# Inverso da funcao acima, coloca um artigo transposto no inicio da string
def unshiftarticle(s):
	for art in [ 'The', 'O', 'A', 'Os', 'As', 'El', 'La', 'Los', 'Las', 'Les', 'Le' ]:
		x = ', ' + art + '$'
		y = art + ' '
		if re.search(x, s):
			return y + re.sub(x, '', s)
	return s

# Remove o artigo inicial
def noarticle(s):
	for art in [ 'The', 'O', 'A', 'Os', 'As', 'El', 'La', 'Los', 'Las', 'Les', 'Le' ]:
		x = '^' + art + ' '
		if re.search(x, s):
			return re.sub(x, '', s)
	return s


# Remove tags entre <> ex: <blabla>
def notag(s):
	return re.sub('<([^>]*)>', '', s)


# Comparacao de anos, baseado em fator de tolerancia -> Atualizado por sugestão do "eseffair"
def compareyear(a, b):
	if int(b) == 0:
		return 1
	if abs(int(a) - int(b)) <= YEAR_MAX_ERROR:
		return 1
	else:
		return 0

# Comparacao de titulos, tolera deslocamento e supressao de artigos 
def comparetitle(a, b): 
	if (a == b) or (noarticle(a) == noarticle(b)) or (a == noarticle(b)) or (noarticle(a) == b) or (a == shiftarticle(b)) or (shiftarticle(a) == b):
		return 1
	else:
		return 0

#### Funcoes especificas ####

# Busca informacoes no adorocinema.com
# Retorna titulo, ano, sinopse e ainda a url de informacao do filme (nao usado)
def getadorocinema(movie):
	movie['title'] = html_replace_clean(movie['title']).title()
	try:
		search_url = 'http://www.adorocinema.com/common/search/search_by_film/?criteria=' + re.sub(' ', '+', movie['title'])+"&section=film"
		f = urllib.urlopen(search_url)
		search_content = f.read()
		f.close()
		debug(search_content)
		search_content = to_unicode_or_bust(search_content)
		id_list = re.findall('<div class=\"search-item\">[\n|\r|\t]*<a href="http://www.adorocinema.com/filmes/([^/]*).*[\n|\r|\t]*.*[\n|\r|\t]*<p>lan[^0-9]*../../([0-9]*)', search_content)
	except:
		return { 'title': '', 'year': '', 'plot': '', 'url': ''}
	if id_list:
		for i,y in id_list:
			if compareyear(y, movie['year']):
				url = 'http://www.adorocinema.com/filmes/' + i + '/'
				f = urllib.urlopen(url)
				page_content = f.read()
				debug(page_content)
				page_content = to_unicode_or_bust(page_content)
				f.close()
				# parsing
				title = re.findall('<td width=\"56%\">[\n|\r|\t]*<h1>([^>]*)</h1>', page_content)
				if title:
					title = title[0]
				else:
					continue
				orig_title = re.findall('<p><strong>titulo original:</strong> \(([^<]*)\)</p>', page_content)
				if orig_title:
					orig_title = orig_title[0]
				else:
					continue
				year = re.findall('<p><strong>lan[^0-9]*([0-9]*)', page_content)
				if year:
					year = year[0]
				else:
					continue
				plot = re.findall('<h4>sinopse:</h4></div>[\n|\r|\t]*(.*)</div>', page_content)
				if plot:
					plot = plot[0]
				else:
					plot = ''
				# limpeza
				title = chomp(title)
				orig_title = to_unicode_or_bust(chomp(orig_title))
				orig_title = html_replace_clean(orig_title.encode('ascii', 'xmlcharrefreplace')).title()
				year = chomp(year)
				plot = notag(chomp(plot))
				# validacao
				if compareyear(year, movie['year']) and comparetitle(orig_title, movie['title']):
					return { 'title': title, 'year': year, 'plot': plot, 'url': url}
					break
			else:
				continue
	# Se nao bater, retorna o dic limpo
	return { 'title': '', 'year': '', 'plot': '', 'url': ''} 		

# Busca informacoes no interfilmes.com
# Retorna titulo, ano, sinopse e ainda a url de informacao do filme (nao usado)
def getinterfilmes(movie):
	movie['title'] = html_replace_clean(movie['title']).title()
	try:
		search_url = 'http://interfilmes.com/busca.html'
		search_params = { "search": movie['title'] }
		search_query = urllib.urlencode(search_params)
		f = urllib.urlopen(search_url, search_query)
		search_content = f.read()
		debug(search_content)
		f.close()
		id_list = re.findall('valign=top><a href=\"filme_([^<]*)\.html\">[^_]*<br>Ano de Lan.amento: ([0-9]*)', search_content)
	except:
		return { 'title': '', 'year': '', 'plot': '', 'url': ''}
	if id_list:
		for i,y in id_list:
			if compareyear(y, movie['year']):
				url = 'http://interfilmes.com/filme_' + i + '.html'
				try:
					f = urllib.urlopen(url)
				except:
					continue
				page_content = f.read()
				f.close()
				debug(page_content)
				title = re.findall('<u>T.tulo no Brasil:</u>&nbsp;\n([^<]*)<br>', page_content)
				if title:
					title = title[0]
				else:
					continue
				orig_title = re.findall('<u>T.tulo Original:</u>&nbsp;\n([^<]*)<br>', page_content)
				if orig_title:
					orig_title = orig_title[0]
				else:
					continue
				year = re.findall('<u>Ano de Lan.amento:</u>&nbsp;\n([0-9]*)<br>', page_content)
				if year:
					year = year[0]
				else:
					continue
				plot = re.findall('<u><b>Sinopse</b></u><br>[\n|\r|\t]*<div align=\"justify\">[\n|\r|\t]*(.*)<br></div>', page_content)
				if plot:
					plot = plot[0]
				else:
					plot = ''
				title = chomp(title)
				orig_title = to_unicode_or_bust(chomp(orig_title))
				orig_title = html_replace_clean(orig_title.encode('ascii', 'xmlcharrefreplace')).title()
				year = chomp(year)
				plot = notag(chomp(plot))
				if compareyear(year, movie['year']) and comparetitle(orig_title, movie['title']):
					return { 'title': title, 'year': year, 'plot': plot, 'url': url}
					break
			else: 
				continue
	return { 'title': '', 'year': '', 'plot': '', 'url': ''} 		

# Busca informacoes no cineplayers.com
# Retorna titulo, ano, sinopse e ainda a url de informacao do filme (nao usado)
def getcineplayers(movie):
	movie['title'] = html_replace_clean(movie['title']).title()
	try:
		search_url = 'http://www.cineplayers.com/busca_res.php'
		search_params = { "titulo_original": shiftarticle(movie['title']), "tipo": "1" }
		search_query = urllib.urlencode(search_params)
		f = urllib.urlopen(search_url, search_query)
		search_content = f.read()
		debug(search_content)
		f.close()
		id_list = re.findall('a href="filme.php\?id=([0-9]*)".*[(]([0-9]*)', search_content)
	except:
		return { 'title': '', 'year': '', 'plot': '', 'url': ''}
	if id_list:
		for i,y in id_list:
			if compareyear(y, movie['year']):
				url = 'http://www.cineplayers.com/filme.php?id=' + i
				try:
					f = urllib.urlopen(url)
				except:
					continue
				page_content = f.read()
				debug(page_content)
				f.close()
				title = re.findall('class=\"tit\">([^<]*)</span>', page_content)
				if title:
					title = title[0]
				else:
					continue
				tmp = re.findall('class=\"txt_italico\">\(([^<]*), <a href=\"index_filmes.php\?ano=([0-9]*)', page_content)
				if tmp:
					orig_title = tmp[0][0]
					year = tmp[0][1]
				else:
					continue
				plot = re.findall('Sinopse:</span> ([^<]*)</div>', page_content)
				if plot:
					plot = plot[0]
				else:
					plot = ''
				title = chomp(title)
				orig_title = to_unicode_or_bust(chomp(orig_title))
				orig_title = html_replace_clean(orig_title.encode('ascii', 'xmlcharrefreplace')).title()
				year = chomp(year)
				plot = notag(chomp(plot))
				if compareyear(year, movie['year']) and comparetitle(orig_title, movie['title']):
					return { 'title': title, 'year': year, 'plot': plot, 'url': url}
					break
			else: 
				continue
	return { 'title': '', 'year': '', 'plot': '', 'url': ''} 	

# Busca informacoes no epipoca.uol.com.br
# Retorna titulo, ano, sinopse e ainda a url de informacao do filme (nao usado)
def getepipoca(movie):
	movie['title'] = html_replace_clean(movie['title']).title()
	try:
		search_url = 'http://epipoca.uol.com.br/busca.php'
		search_params = { 'busca': movie['title'], 'opc': 'filmes' }
		search_query = urllib.urlencode(search_params)
		f = urllib.urlopen(search_url, search_query)
		search_content = f.read()
		debug(search_content)
		f.close()
		id_list = re.findall('class=\"titulo\"><a href=\"filmes_detalhes.php\?idf=([0-9]*)\">.*<a href=\"busca_mais.php\?opc=ano&busca=([0-9]*)\">', search_content)
	except:
		return { 'title': '', 'year': '', 'plot': '', 'url': ''}
	if id_list:
		for i,y in id_list:
			if compareyear(y, movie['year']):
				url = 'http://epipoca.uol.com.br/filmes_detalhes.php?idf=' + i
				try:
					f = urllib.urlopen(url)
				except:
					continue
				page_content = f.read()
				f.close()
				title = re.findall('class="titulo">([^<]*)</font><br>', page_content)
				if title:
					title = title[0]
				else:
					continue
				orig_title = re.findall('</font><br>\(([^<]*), <a href=\"busca_mais.php\?opc=pais&busca=', page_content)
				if orig_title:
					orig_title = orig_title[0]
				else:
					continue
				year = re.findall('a href=\"busca_mais.php\?opc=ano&busca=([0-9]*)\">', page_content)
				if year:
					year = year[0]
				else:
					continue
				plot = re.findall('<b>SINOPSE</b></font><br><br>([^<]*)</td></tr>', page_content)
				if plot:
					plot = plot[0]
				else:
					plot = ''

				title = chomp(title)
				orig_title = to_unicode_or_bust(chomp(orig_title))
				orig_title = html_replace_clean(orig_title.encode('ascii', 'xmlcharrefreplace')).title()
				year = chomp(year)
				plot = notag(chomp(plot))
				if compareyear(year, movie['year']) and comparetitle(orig_title, movie['title']):
					return { 'title': title, 'year': year, 'plot': plot, 'url': url}
					break
			else: 
				continue
	return { 'title': '', 'year': '', 'plot': '', 'url': ''}	
	
#### Funções novas ####	

spc = (('&#192;','A'),	('&#193;','A'),	('&#194;','A'),	('&#195;','A'),	('&#196;','A'),	('&#199;','C'),	('&#200;','E'),	('&#201;','E'), ('&#198;','AE'),
	('&#202;','E'),	('&#203;','E'),	('&#204;','I'),	('&#205;','I'),	('&#207;','I'),	('&#217;','U'),	('&#218;','U'),	('&#220;','U'),
	('&#219;','U'),	('&#224;','a'),	('&#225;','a'),	('&#226;','a'),	('&#227;','a'),	('&#228;','a'),	('&#231;','c'),	('&#232;','e'),
	('&#233;','e'),	('&#234;','e'),	('&#235;','e'),	('&#236;','i'),	('&#237;','i'),	('&#238;','i'),	('&#239;','i'),	('&#242;','o'),
	('&#243;','o'),	('&#244;','o'),	('&#245;','o'),	('&#249;','u'),	('&#250;','u'),	('&#251;','u'),	('&#252;','u'),	('&#221;','Y'),	('&#253;','y'))

def html_replace_clean(s):
	for code,caracter in spc:
		s = s.replace(code,caracter)
	return s

# Tansforma as strings em Unicode
def to_unicode_or_bust(
         obj, encoding='iso-8859-1'):
     if isinstance(obj, basestring):
         if not isinstance(obj, unicode):
             obj = unicode(obj, encoding)
     return obj

#Traduz os gêneros
#A lista de tuplas abaixo não contem todos os gêneros, por favor adicione mais equivalências.
genres = ((u'Action',u'Ação'),(u'Adventure',u'Aventura'),(u'Animation',u'Animação'),(u'Biography',u'Biografia'),(u'Comedy',u'Comédia'),(u'Documentary',u'Documentário'),(u'Family',u'Família'),(u'Fantasy',u'Fantasia'),(u'History',u'História'),(u'Music',u'Música'),(u'Mystery',u'Mistério'),(u'News',u'Notícia'),(u'Sci-Fi',u'Ficção científica'),(u'Sport',u'Esporte'),(u'War',u'Guerra'),(u'Western',u'Ocidental'),(u'Science Fiction',u'Ficção científica'),(u'Literary Fiction',u'Ficção Literária'),(u'Film',u''),(u'Comic',u'Quadrinho'),(u'Time Travel',u'Viagem no Tempo'),(u'Destiny',u'Destino'),(u'Independent',u'Independente'),(u'Porn',u'Pornô'),(u'Movie',u''),('Adult','Adulto'),(u'Teen',u'Adolescente'),(u'Road',u'Estrada'),(u'Pornographic',u'Pornográfico'),(u'Spy',u'Espionagem'),(u'Disaster',u'Desastre'),(u'Black Comedy',u'Humor Negro'),(u'Black comedy',u'Humor negro'),('Martial arts','Artes marciais'),('Martial Arts','Artes Marciais'))

def gentraz(s):
	for genre_eng, genre_pt in genres:
		s = s.replace(genre_eng,genre_pt)
	return s

# Busca o valor de um determinado objeto, e se o mesmo não existir, cria um objeto com o mesmo nome apenas com um "espaço" como valor
# Essa função visa resolver os casos onde o Ember não escreve o "Plot", apenas o "Outline"
def node_val(s,xml_file):
	if not xml_file.getElementsByTagName(s):
		newel = xml_file.createElement(s)
		newtx = xml_file.createTextNode(' ')
		newel.appendChild(newtx)
		xml_file.getElementsByTagName("movie").item(0).appendChild(newel)
	try:
		if xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue:
			output = xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue
	except:
		newtx = xml_file.createTextNode(' ')
		xml_file.getElementsByTagName(s).item(0).appendChild(newtx)
		output = xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue		
	output = to_unicode_or_bust(output)
	return output

# Escreve o valor enviado para o elemento especificado e, caso este não exista, será criado com o valor especificado
def elem_val(s,v,xml_file):
	if not xml_file.getElementsByTagName(s):
		newel = xml_file.createElement(s)
		newtx = xml_file.createTextNode(' ')
		newel.appendChild(newtx)
		xml_file.getElementsByTagName("movie").item(0).appendChild(newel)
	try:
		if xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue:
			if v:
				v = to_unicode_or_bust(v)
				xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue = v
	except:
		newtx = xml_file.createTextNode(' ')
		xml_file.getElementsByTagName(s).item(0).appendChild(newtx)
		if v:
			v = to_unicode_or_bust(v)
			xml_file.getElementsByTagName(s).item(0).childNodes[0].nodeValue = v			
	return

def scrap(filename,ignore_trad):
	texto_saida=""
	try:
		xml_file = parse(filename)
	except:
		return
	
	if xml_file.getElementsByTagName("originaltitle"):
		title = node_val("originaltitle",xml_file)
	else:
		elem_val("originaltitle",xml_file.getElementsByTagName("title").item(0).childNodes[0].nodeValue,xml_file)
		title = node_val("originaltitle",xml_file)
			
	texto_saida=texto_saida+u"\n<> Abrindo arquivo: "+filename+"\n"
	texto_saida=texto_saida+u"<-> Nome original do filme: "+to_unicode_or_bust(title)+"\n"

	# Ignora se o filme já foi traduzido, caso -> ignore_trad = 1
	if ignore_trad == 1:
		if xml_file.getElementsByTagName("traduzido"):
			texto_saida=texto_saida+u"---> Ignorando... [Já traduzido!]"+"\n\n"
			print_texto(texto_saida)
			log_ignorados.append(filename)
			return

	# --> A última parte evita que valores em Unicode sejam enviados para as funções "scrappers", tansformando esses valores em valores HTML
	title = title.encode('ascii', 'xmlcharrefreplace') 
	year = node_val("year", xml_file)
	plot = node_val("plot", xml_file)
	movie = {'title': chomp(title), 'year': year }

	#Traduz os gêneros
	elem_val("genre", gentraz(node_val("genre", xml_file)), xml_file)

	# A ordem de pesquisa é:
	# 1. Cineplayers
	# 2. Epipoca
	# 3. Interfilmes
	# 4. Adorocinema
	#
	# PS: sinta-se a vontade para mudar a ordem :)

	res = getcineplayers(movie)
	brtitle = res['title']
	brplot  = res['plot']
	if brtitle != '' and plot != '':
		elem_val("title", brtitle, xml_file)
		elem_val("plot", brplot, xml_file)
		elem_val("outline", brplot, xml_file)
		elem_val("traduzido", "Cineplayers", xml_file)
		texto_saida=texto_saida+u"|<o>| Nome traduzido do filme: "+to_unicode_or_bust(brtitle)+"\n"
		texto_saida=texto_saida+u"<-=-=> Traduzido usando o Cineplayers."+"\n"
		log_traduzidos.append("Cineplayers: "+to_unicode_or_bust(filename)+"  --->  "+to_unicode_or_bust(brtitle))
	else:
		res = getepipoca(movie)
		brtitle = res['title']
		brplot  = res['plot']
		if brtitle != '' and plot != '':
			elem_val("title", brtitle, xml_file)
			elem_val("plot", brplot, xml_file)
			elem_val("outline", brplot, xml_file)
			elem_val("traduzido", "e-Pipoca", xml_file)
			texto_saida=texto_saida+u"|<o>| Nome traduzido do filme: "+to_unicode_or_bust(brtitle)+"\n"
			texto_saida=texto_saida+u"<-=-=> Traduzido usando o e-Pipoca.\n"
			log_traduzidos.append("e-Pipoca:    "+to_unicode_or_bust(filename)+"  --->  "+to_unicode_or_bust(brtitle))
		else:
			res = getinterfilmes(movie)
			brtitle = res['title']
			brplot  = res['plot']
			if brtitle != '' and plot != '':
				elem_val("title", brtitle, xml_file)
				elem_val("plot", brplot, xml_file)
				elem_val("outline", brplot, xml_file)
				elem_val("traduzido", "Interfilmes", xml_file)
				texto_saida=texto_saida+u"|<o>| Nome traduzido do filme: "+to_unicode_or_bust(brtitle)+"\n"
				texto_saida=texto_saida+"<-=-=> Traduzido usando o Interfilmes.\n"
				log_traduzidos.append("Interfilmes: "+to_unicode_or_bust(filename)+"  --->  "+to_unicode_or_bust(brtitle))
			else:
				res = getadorocinema(movie)
				brtitle = res['title']
				brplot  = res['plot']
				if brtitle != '' and plot != '':
					elem_val("title", brtitle, xml_file)
					elem_val("plot", brplot, xml_file)
					elem_val("outline", brplot, xml_file)
					elem_val("traduzido", "Adorocinema", xml_file)
					texto_saida=texto_saida+u"|<o>| Nome traduzido do filme: "+to_unicode_or_bust(brtitle)+"\n"
					texto_saida=texto_saida+u"<-=-=> Traduzido usando o Adorocinema.\n"
					log_traduzidos.append("AdoroCinema: "+to_unicode_or_bust(filename)+"  --->  "+to_unicode_or_bust(brtitle))
				else:
					texto_saida=texto_saida+" /!\ Filme nao encontrado... :(".encode(sysencode)+"\n\n"
					log_faltantes.append(filename)
					return					
	
	shutil.copyfile(filename,"%s.bkp" % (filename))
	texto_saida=texto_saida+u"Criado backup em %s.bkp".encode(sysencode) % (to_unicode_or_bust(filename))
	texto_saida=texto_saida+u"\n\n"
	arquivo = open(filename,"w")
	arquivo.write(codecs.BOM_UTF8) # Sinaliza o arquivo como UTF-8
	arquivo.write(xml_file.toxml("UTF-8")) #---> Transforma o fim de linha do formato Unix para o formato Windows
	arquivo.close()
	print_texto(texto_saida)
	return

# Busca recursivamente os nfos
def dirEntries(dir_name, subdir, *args):
    fileList = []
    for file in os.listdir(dir_name):
        dirfile = os.path.join(dir_name, file)
        if os.path.isfile(dirfile):
            if not args:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)
        # recursively access file names in subdirectories
        elif os.path.isdir(dirfile) and subdir:
            fileList.extend(dirEntries(dirfile, subdir, *args))
    return fileList

def codigo_basico(caminho,ignore_trad,*args):
	#Verifica se o caminho é pasta ou arquivo, e examina recursivamente as pastas
	if os.path.isdir(caminho):
		arquivos = dirEntries(caminho, True, "nfo")
		for nfo in arquivos:
			stat.set("Traduzindo "+os.path.normpath(nfo))
			scrap(os.path.normpath(nfo), ignore_trad)
	else:
		if os.path.isfile(caminho):
			stat.set("Traduzindo: "+os.path.normpath(caminho))
			scrap(os.path.normpath(caminho), ignore_trad)
		
	# Escreve arquivo de log
	lista_faltantes = u"Lista de arquivos não traduzidos: \r\n \r\n"
	for s in log_faltantes:
		lista_faltantes = lista_faltantes + "     "+to_unicode_or_bust(s)+"\r\n"
	lista_traduzidos = u"Lista de arquivos traduzidos: \r\n \r\n"
	for s in log_traduzidos:
		lista_traduzidos = lista_traduzidos + "     "+to_unicode_or_bust(s)+"\r\n"
	lista_ignorados = u"Lista de arquivos ignorados: \r\n \r\n"
	for s in log_ignorados:
		lista_ignorados = lista_ignorados + "     "+to_unicode_or_bust(s)+"\r\n"

	conteudo_log = u"Log para a tradução do caminho "+caminho+": \r\n \r\n"+lista_faltantes+"\r\n \r\n \r\n"+lista_traduzidos+"\r\n \r\n \r\n"+lista_ignorados
	log = open(os.path.abspath(os.path.dirname(sys.argv[0]))+"/log_translate.log","w")
	log.write(codecs.BOM_UTF8) # Sinaliza o arquivo como UTF-8
	conteudo_log = to_unicode_or_bust(conteudo_log).encode("utf-8")
	print_texto(conteudo_log+"\n\n----------------------------------------------------\n")
	log.write(conteudo_log)
	stat.set("Tradução finalizada.")
	log.close()
	
def debug(s=1):
	return
	
##Grava e lembra do último diretório pesquisado
def LastPath(path=0):
	config = ConfigParser.ConfigParser()
	config.readfp(open(inifile, "r"))
	if not path ==0 and not path == "":
		if config.has_section("Defaults"):
			config.set("Defaults","last_path",path.encode('ascii', 'xmlcharrefreplace'))
		else:
			config.add_section("Defaults")
			config.set("Defaults","last_path", " ")
		config.write(open(inifile, "w"))
		return
	else:
		if config.has_section("Defaults") and config.has_option("Defaults","last_path"):
			last_path = html_replace_clean(config.get("Defaults","last_path"))
		else:
			if not config.has_section("Defaults"):
				config.add_section("Defaults")
			config.set("Defaults","last_path", " ")
			last_path = config.get("Defaults","last_path")
			config.write(open(inifile, "w"))
		return last_path

if __name__ == "__main__":

	def print_texto(s):
			text['state'] = 'normal'
			text.insert(0.0,s)
			text['state'] = 'disabled'

	def restaurar_backups():
			caminho = tkFileDialog.askdirectory(parent=root,initialdir=LastPath(),title='')
			LastPath(caminho)
			if caminho:
					if os.path.isdir(caminho):
							arquivos = dirEntries(caminho, True, "bkp")
							for bkp in arquivos:
									shutil.copyfile(bkp,bkp.strip(".bkp"))
									print_texto("\n--> Restaurando arquivo "+bkp.strip(".bkp")+"\n")

	def arquivo():
			ignore_trad = 0
			if tkMessageBox.askyesno("Ignorar",u"Ignorar se o arquivo já foi traduzido?"):ignore_trad=1
			myFormats = [('NFO','*.nfo')]
			caminho = tkFileDialog.askopenfilename(parent=root,title='',initialdir=LastPath(),filetypes=myFormats)
			LastPath(caminho)
			if caminho:
				thread.start_new_thread(codigo_basico,(caminho,ignore_trad))

	def diretorio():
			ignore_trad = 0
			if tkMessageBox.askyesno("Ignorar",u"Ignorar os arquivos já traduzidos?"):ignore_trad=1
			caminho = tkFileDialog.askdirectory(parent=root,initialdir=LastPath(),title='')
			LastPath(caminho)
			if caminho:
				stat.set("Pesquisando a pasta "+caminho)
				thread.start_new_thread(codigo_basico,(caminho,ignore_trad))

	def MostraAjuda(s=0):
		global help1
		help1 = Toplevel(root)
		help1.resizable(width=NO, height=NO)
		help1.title("Sobre...")
		help1.geometry("250x130")
		Label(help1, text="Tradutor Ember/XBMC",font=("Sans", 10, "bold")).pack(pady=10)
		Label(help1, text="Versão do aplicativo: "+APPVER,font=("Sans", 10, "normal")).pack(pady=5,padx=10)
		link = Label(help1, text="Clique aqui para abrir a ajuda.",font=("Sans", 10, "bold"), foreground="Blue",cursor="hand2")
		link.pack(pady=10,padx=10)
		link.bind("<Button-1>",LBrowser)
		help1.grab_set()

	def LBrowser(s=0):
		webbrowser.open(HelpURL, new=2, autoraise=True)

	root = Tk()
	if sys.platform == 'win32':
		root.iconbitmap(default=os.path.join(os.getcwd(),'icon.dll'))
	root.wm_title('Tradutor Ember/XBMC versão '+APPVER+' GUI')
	root.geometry("640x320")
	menubar = Menu(root)
	MENUarquivo = Menu(menubar,tearoff=0)
	MENUarquivo.add_command(label="Processar Arquivo", command=arquivo)
	MENUarquivo.add_command(label="Processar Diretorio", command=diretorio)
	MENUarquivo.add_command(label="Restaurar Backups", command=restaurar_backups)
	menubar.add_cascade(label="Arquivo", menu=MENUarquivo)

	MENUajuda = Menu(menubar,tearoff=0)
	MENUajuda.add_command(label="Sobre", command=MostraAjuda)
	menubar.add_cascade(label="Ajuda", menu=MENUajuda)
	root.config(menu=menubar)
	
	frame = Frame(root)
	frame_text = Frame(frame)
	scrollbar = Scrollbar(frame_text)
	scrollbar.pack(side=RIGHT, fill=Y)
	text = Text(frame_text,state='disabled', height=10)
	text.pack(expand=1, fill=BOTH)
	text.config(yscrollcommand=scrollbar.set)
	scrollbar.config(command=text.yview)
	frame_text.pack(fill=BOTH, pady=2, padx=2, expand=1)

	stat = StringVar()
	status = Frame(frame)
	statusbar = Label(status,textvariable=stat,font=("Sans", 10, "normal"),anchor=W)
	statusbar.pack(fill=X)
	status.pack(fill=X)
	frame.pack(fill=BOTH,expand=1)
	mainloop()
